package com.jason.campusinn.view;/*
package com.jason.campusinn.view;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.Animation;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import android.widget.TextView;

import com.yuandian.wanna.R;

*/
/**
 * can only be used for ArticleList 
 *//*

@SuppressLint({ "ClickableViewAccessibility", "InflateParams" })
public class XListView extends ListView implements OnScrollListener {

	private float mLastY = -1; // save event y
	private float mLastX = -1; // save event x
	private Scroller mScroller; // used for scroll back
	private OnScrollListener mScrollListener; // user's scroll listener

	// the interface to trigger refresh and load more.
	private IXListViewListener mListViewListener;

	// -- header view
	private XListViewHeader mHeaderView;
	// header view content, use it to calculate the Header's height. And hide it
	// when disable pull refresh.
	private RelativeLayout mHeaderViewContent;
	private TextView mHeaderHint;
	private TextView mHeaderTimeView;
	private int mHeaderViewHeight; // header view's height
	private boolean mEnablePullRefresh = true;
	private boolean mPullRefreshing = false; // is refreashing.

	// -- footer view
	private XListViewFooter mFooterView;
	private TextView mFooterHint;
	private boolean mEnablePullLoad;
	private boolean mPullLoading;
	private boolean mIsFooterReady = false;

	// total list items, used to detect is at the bottom of listview.
	private int mTotalItemCount;

	// for mScroller, scroll back from header or footer.
	private int mScrollBack;
	private final static int SCROLLBACK_HEADER = 0;
	private final static int SCROLLBACK_FOOTER = 1;

	private final static int SCROLL_DURATION = 400; // scroll back duration
	private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px
														// at bottom, trigger
														// load more.
	private final static float OFFSET_RADIO = 1.8f; // support iOS like pull
													// feature.

	private boolean mEnableAutoLoad = false;

    */
/**设置是否支持自动加载更多*//*

	public void setAutoLoadMore(boolean isAuto) {
		mEnableAutoLoad = true;
	}

//	private Context context;
	

	*/
/**
	 * @param context
	 *//*

	public XListView(Context context) {
		super(context);
		initWithContext(context);
	}

	public XListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initWithContext(context);
	}

	public XListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initWithContext(context);
	}

	public Scroller getmScroller() {
		return mScroller;
	}

	public void setmScroller(Scroller mScroller) {
		this.mScroller = mScroller;
	}

	public XListViewHeader getmHeaderView() {
		return mHeaderView;
	}

	public void setmHeaderView(XListViewHeader mHeaderView) {
		this.mHeaderView = mHeaderView;
	}

	public boolean ismPullRefreshing() {
		return mPullRefreshing;
	}

	public void setmPullRefreshing(boolean mPullRefreshing) {
		this.mPullRefreshing = mPullRefreshing;
	}

	private void initWithContext(Context context) {
//		this.context = context;
		mScroller = new Scroller(context, new DecelerateInterpolator());
		// XListView need the scroll event, and it will dispatch the event to
		// user's listener (as a proxy).
		super.setOnScrollListener(this);

		// init header view
		mHeaderView = new XListViewHeader(context);
		mHeaderViewContent = (RelativeLayout) mHeaderView
				.findViewById(R.id.xlistview_header_content);
		mHeaderTimeView = (TextView) mHeaderView
				.findViewById(R.id.xlistview_header_time);
		mHeaderHint = (TextView) mHeaderView
				.findViewById(R.id.xlistview_header_hint_textview);
		addHeaderView(mHeaderView);
//		setDefaultRefreshTime();
		// init footer view
		mFooterView = new XListViewFooter(context);
		mFooterHint = (TextView) findViewById(R.id.xlistview_footer_hint_textview);

		// init header height
		mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
				new OnGlobalLayoutListener() {
					@Override
					public void onGlobalLayout() {
						mHeaderViewHeight = mHeaderViewContent.getHeight();
						getViewTreeObserver()
								.removeGlobalOnLayoutListener(this);
					}
				});
		mHeaderView.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {

			}
		});
		mFooterView.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {

			}
		});
	}

	public void setAdapter(ListAdapter adapter) {
		// make sure XListViewFooter is the last footer view, and only add once.
		if (mIsFooterReady == false) {
			mIsFooterReady = true;
			addFooterView(mFooterView);
		}
		super.setAdapter(adapter);
	}

	*/
/**
	 * enable or disable pull down refresh feature.
	 * 
	 * @param enable
	 *//*

	public void setPullRefreshEnable(boolean enable) {
		mEnablePullRefresh = enable;
		if (!mEnablePullRefresh) { // disable, hide the content
			mHeaderViewContent.setVisibility(View.INVISIBLE);
		} else {
			mHeaderViewContent.setVisibility(View.VISIBLE);
		}
	}

	*/
/**
	 * enable or disable pull up load more feature.
	 * 
	 * @param enable
	 *//*

	public void setPullLoadEnable(boolean enable) {
		mEnablePullLoad = enable;
		if (!mEnablePullLoad) {
			mFooterView.hide();
			mFooterView.setBottomMargin(0);
			mFooterView.setOnClickListener(null);
		} else {
			mPullLoading = false;
			mFooterView.show();
			mFooterView.setState(XListViewFooter.STATE_NORMAL);
			// both "pull up" and "click" will invoke load more.
			mFooterView.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					// startLoadMore();
				}
			});
		}
	}

	*/
/**
	 * set list state is refreshing and do http request
	 *//*

	public void doFirstRefresh() {
		mHeaderView.show();
		mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
		mPullRefreshing = true;
		invalidate();
		setDefaultRefreshTime();
//		startRefresh();
	}

	*/
/**
	 * stop refresh, reset header view.
	 *//*

	public void stopRefresh() {
		if (mPullRefreshing == true) {
			mPullRefreshing = false;
			resetHeaderHeight();
//			SharedPreferenceUtil.setSharedlongData(context,
//					Constants.TIMESTAMP_REFRESH, System.currentTimeMillis());
//			saveRefreshTime();
		}
	}
	

	private void setDefaultRefreshTime() {
//		long lastStamp = SharedPreferenceUtil.getSharedlongData(context,
//				Constants.TIMESTAMP_REFRESH);
//		setRefreshTime(TimeUtil.getDescriptionTimeFromTimestamp(getRefreshTime()));
	}
	

	*/
/**
	 * stop load more, reset footer view.
	 *//*

	public void stopLoadMore() {
		if (mPullLoading == true) {
			mPullLoading = false;
			mFooterView.setState(XListViewFooter.STATE_NORMAL);
		}
	}

	*/
/**
	 * set last refresh time
	 * 
	 * @param time
	 *//*

	public void setRefreshTime(String time) {
		mHeaderTimeView.setText(time);
	}

	public void setHeaderHint(String hint) {
		mHeaderHint.setText(hint);
	}

	public void setFooterHint(String hint) {
		mFooterHint.setText(hint);
	}

	private void invokeOnScrolling() {
		if (mScrollListener instanceof OnXScrollListener) {
			OnXScrollListener l = (OnXScrollListener) mScrollListener;
			l.onXScrolling(this);
		}
	}

	private void updateHeaderHeight(float delta) {
		mHeaderView.setVisiableHeight((int) delta
				+ mHeaderView.getVisiableHeight());
		if (mEnablePullRefresh && !mPullRefreshing) { // 未处于刷新状态，更新箭头
			if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
				mHeaderView.setState(XListViewHeader.STATE_READY);
			} else {
				mHeaderView.setState(XListViewHeader.STATE_NORMAL);
			}
		}
		setSelection(0); // scroll to top each time
	}

	*/
/**
	 * reset header view's height.
	 *//*

	public void resetHeaderHeight() {
		int height = mHeaderView.getVisiableHeight();
		if (height == 0) // not visible.
			return;
		// refreshing and header isn't shown fully. do nothing.
		if (mPullRefreshing && height <= mHeaderViewHeight) {
			return;
		}
		int finalHeight = 0; // default: scroll back to dismiss header.
		// is refreshing, just scroll back to show all the header.
		if (mPullRefreshing && height > mHeaderViewHeight) {
			finalHeight = mHeaderViewHeight;
		}
		mScrollBack = SCROLLBACK_HEADER;
		mScroller.startScroll(0, height, 0, finalHeight - height,
				SCROLL_DURATION);
		// trigger computeScroll
		invalidate();
	}

	private void updateFooterHeight(float delta) {
		int height = mFooterView.getBottomMargin() + (int) delta;
		if (mEnablePullLoad && !mPullLoading) {
			if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load
													// more.
				mFooterView.setState(XListViewFooter.STATE_READY);
			} else {
				mFooterView.setState(XListViewFooter.STATE_NORMAL);
			}
		}
		mFooterView.setBottomMargin(height);

		// setSelection(mTotalItemCount - 1); // scroll to bottom
	}

	private void resetFooterHeight() {
		int bottomMargin = mFooterView.getBottomMargin();
		if (bottomMargin > 0) {
			mScrollBack = SCROLLBACK_FOOTER;
			mScroller.startScroll(0, bottomMargin, 0, -bottomMargin,
					SCROLL_DURATION);
			invalidate();
		}
	}

	private void startRefresh() {
		if (mEnablePullRefresh
				&& mHeaderView.getVisiableHeight() >= mHeaderViewHeight
				&& !mPullRefreshing && !mPullLoading) {
			mPullRefreshing = true;
			mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
			if (mListViewListener != null) {
				mListViewListener.onRefresh();
			}
		}
	}

	private void startLoadMore() {
		mPullLoading = true;
		mFooterView.setState(XListViewFooter.STATE_LOADING);
		if (mListViewListener != null) {
			mListViewListener.onLoadMore();
		}
	}

	public interface SlidingDirectionListener{
		void slidingUp();
		void slidingDown();
	}
	private SlidingDirectionListener sdListener;
	public void setSlidingDirectionListener(SlidingDirectionListener l){
		this.sdListener = l;
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		if (mLastY == -1) {
			mLastY = ev.getRawY();
		}
		if (mLastX == -1) {
			mLastX = ev.getRawX();
		}
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			mLastY = ev.getRawY();
			mLastX = ev.getRawX();
			break;
		case MotionEvent.ACTION_MOVE:
			final float deltaY = ev.getRawY() - mLastY;
			startNavigationAnimation(deltaY);
			mLastY = ev.getRawY();
			if (getFirstVisiblePosition() == 0
					&& (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)
			// && !mPullLoading
			) {
				// the first item is showing, header has shown or pull down.
				setDefaultRefreshTime();
				updateHeaderHeight(deltaY / OFFSET_RADIO);
				invokeOnScrolling();
			} else if (getLastVisiblePosition() == mTotalItemCount - 1
					&& (mFooterView.getBottomMargin() > 0 || deltaY < 0)
					&& !mPullRefreshing) {
				// last item, already pulled up or want to pull up.
				updateFooterHeight(-deltaY / OFFSET_RADIO);
			}
			break;
		default:
			mLastY = -1; // reset
			if (getFirstVisiblePosition() == 0) {
				// invoke refresh
				startRefresh();
				resetHeaderHeight();
			} else if (getLastVisiblePosition() == mTotalItemCount - 1
			// && !mPullLoading
			) {
				// invoke load more.
				if (mEnablePullLoad
						&& mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA
						&& !mPullRefreshing && !mPullLoading) {
					startLoadMore();
				}
				resetFooterHeight();
			}
			break;
		}
		return super.onTouchEvent(ev);
	}
	
	@Override
	public void computeScroll() {
		if (mScroller.computeScrollOffset()) {
			if (mScrollBack == SCROLLBACK_HEADER) {
				mHeaderView.setVisiableHeight(mScroller.getCurrY());
			} else {
				mFooterView.setBottomMargin(mScroller.getCurrY());
			}
			postInvalidate();
			invokeOnScrolling();
		}
		super.computeScroll();
	}

	@Override
	public void setOnScrollListener(OnScrollListener l) {
		mScrollListener = l;
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		if (mScrollListener != null) {
			mScrollListener.onScrollStateChanged(view, scrollState);
		}
	}
	
	private void startNavigationAnimation(float deltaY){
		if(sdListener != null){
			if(deltaY > 5){
				sdListener.slidingDown();
			}
			if(deltaY < -5){
				sdListener.slidingUp();
			}
		}
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		if (mEnableAutoLoad) {
			setAutoLoadMore();
		}
		// send to user's listener
		mTotalItemCount = totalItemCount;
		if (mScrollListener != null) {
			mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,
					totalItemCount);
		}
	}
	
	private void setAutoLoadMore() {
		if (mEnablePullLoad && !mPullRefreshing && !mPullLoading) {
			if (getLastVisiblePosition() == getCount() - 1) {
				if (getChildAt(getLastVisiblePosition()
						- getFirstVisiblePosition()) != null
						&& getChildAt(
								getLastVisiblePosition()
										- getFirstVisiblePosition()).getTop() < getMeasuredHeight()) {
					startLoadMore();
				}
			}
		}
	}

	public void setXListViewListener(IXListViewListener l) {
		mListViewListener = l;
	}

	*/
/**
	 * you can listen ListView.OnScrollListener or this one. it will invoke
	 * onXScrolling when header/footer scroll back.
	 *//*

	public interface OnXScrollListener extends OnScrollListener {
		public void onXScrolling(View view);
	}

	*/
/**
	 * implements this interface to get refresh/load more event.
	 *//*

	public interface IXListViewListener {
		public void onRefresh();

		public void onLoadMore();
	}

	*/
/**
	 * headerview
	 * 
	 * @author Administrator
	 * 
	 *//*

	public class XListViewHeader extends LinearLayout {
		private LinearLayout mContainer;
		private ImageView mArrowImageView;
		private ProgressBar mProgressBar;
		private TextView mHintTextView;
		private int mState = STATE_NORMAL;

		private Animation mRotateUpAnim;
		private Animation mRotateDownAnim;

		private final int ROTATE_ANIM_DURATION = 180;

		public final static int STATE_NORMAL = 0;
		public final static int STATE_READY = 1;
		public final static int STATE_REFRESHING = 2;

		public XListViewHeader(Context context) {
			super(context);
			initView(context);
		}

		*/
/**
		 * @param context
		 * @param attrs
		 *//*

		public XListViewHeader(Context context, AttributeSet attrs) {
			super(context, attrs);
			initView(context);
		}

		private void initView(Context context) {
			LayoutParams lp = new LayoutParams(
					android.view.ViewGroup.LayoutParams.FILL_PARENT, 0);
			mContainer = (LinearLayout) LayoutInflater.from(context).inflate(
					R.layout.xlistview_header, null);
			addView(mContainer, lp);
			setGravity(Gravity.BOTTOM);

			mArrowImageView = (ImageView) findViewById(R.id.xlistview_header_arrow);
			mHintTextView = (TextView) findViewById(R.id.xlistview_header_hint_textview);
			mProgressBar = (ProgressBar) findViewById(R.id.xlistview_header_progressbar);

			mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
					Animation.RELATIVE_TO_SELF, 0.5f,
					Animation.RELATIVE_TO_SELF, 0.5f);
			mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
			mRotateUpAnim.setFillAfter(true);
			mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
					Animation.RELATIVE_TO_SELF, 0.5f,
					Animation.RELATIVE_TO_SELF, 0.5f);
			mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);
			mRotateDownAnim.setFillAfter(true);
		}

		*/
/**
		 * 显示正在刷新布局
		 *//*

		public void show() {
			LayoutParams lp = new LayoutParams(
					android.view.ViewGroup.LayoutParams.FILL_PARENT,
					android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
			mContainer.setLayoutParams(lp);
		}

		public void setState(int state) {
			if (state == mState)
				return;

			if (state == STATE_REFRESHING) { // 显示进度
				mArrowImageView.clearAnimation();
				mArrowImageView.setVisibility(View.INVISIBLE);
				mProgressBar.setVisibility(View.VISIBLE);
			} else { // 显示箭头图片
				mArrowImageView.setVisibility(View.VISIBLE);
				mProgressBar.setVisibility(View.INVISIBLE);
			}

			switch (state) {
			case STATE_NORMAL:
				if (mState == STATE_READY) {
					mArrowImageView.startAnimation(mRotateDownAnim);
				}
				if (mState == STATE_REFRESHING) {
					mArrowImageView.clearAnimation();
				}
				mHintTextView.setText(R.string.xlistview_header_hint_normal);
				break;
			case STATE_READY:
				if (mState != STATE_READY) {
					mArrowImageView.clearAnimation();
					mArrowImageView.startAnimation(mRotateUpAnim);
					mHintTextView.setText(R.string.xlistview_header_hint_ready);
				}
				break;
			case STATE_REFRESHING:
				mHintTextView.setText(R.string.xlistview_header_hint_loading);
				break;
			default:
			}

			mState = state;
		}

		public void setVisiableHeight(int height) {
			if (height < 0)
				height = 0;
			LayoutParams lp = (LayoutParams) mContainer
					.getLayoutParams();
			lp.height = height;
			mContainer.setLayoutParams(lp);
		}

		public int getVisiableHeight() {
			return mContainer.getHeight();
		}
	}

	*/
/**
	 * footerview
	 * 
	 * @author Administrator
	 * 
	 *//*

	public class XListViewFooter extends LinearLayout {
		public final static int STATE_NORMAL = 0;
		public final static int STATE_READY = 1;
		public final static int STATE_LOADING = 2;

		private Context mContext;

		private View mContentView;
		private View mProgressBar;
		private TextView mHintView;

		public XListViewFooter(Context context) {
			super(context);
			initView(context);
		}

		public XListViewFooter(Context context, AttributeSet attrs) {
			super(context, attrs);
			initView(context);
		}

		public void setState(int state) {
//			 mHintView.setVisibility(View.INVISIBLE);
			mProgressBar.setVisibility(View.INVISIBLE);
//			 mHintView.setVisibility(View.INVISIBLE);
			if (state == STATE_READY) {
//				 mHintView.setVisibility(View.VISIBLE);
				mHintView.setText(R.string.xlistview_footer_hint_ready);
			} else if (state == STATE_LOADING) {
				mProgressBar.setVisibility(View.VISIBLE);
				mHintView.setText(R.string.xlistview_header_hint_loading);
			} else {
				// mHintView.setVisibility(View.VISIBLE);
				mHintView.setText(R.string.xlistview_footer_hint_normal);
			}
		}

		public void setBottomMargin(int height) {
			if (height < 0)
				return;
			LayoutParams lp = (LayoutParams) mContentView
					.getLayoutParams();
			lp.bottomMargin = height;
			mContentView.setLayoutParams(lp);
		}

		public int getBottomMargin() {
			LayoutParams lp = (LayoutParams) mContentView
					.getLayoutParams();
			return lp.bottomMargin;
		}

		*/
/**
		 * normal status
		 *//*

		public void normal() {
			mHintView.setVisibility(View.VISIBLE);
			mProgressBar.setVisibility(View.GONE);
		}

		*/
/**
		 * loading status
		 *//*

		public void loading() {
//			mHintView.setVisibility(View.GONE);
			mProgressBar.setVisibility(View.VISIBLE);
		}

		*/
/**
		 * hide footer when disable pull load more
		 *//*

		public void hide() {
			LayoutParams lp = (LayoutParams) mContentView
					.getLayoutParams();
			lp.height = 0;
			mContentView.setLayoutParams(lp);
		}

		*/
/**
		 * show footer
		 *//*

		public void show() {
			LayoutParams lp = (LayoutParams) mContentView
					.getLayoutParams();
			lp.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
			mContentView.setLayoutParams(lp);
		}

		private void initView(Context context) {
			mContext = context;
			LinearLayout moreView = (LinearLayout) LayoutInflater
					.from(mContext).inflate(R.layout.xlistview_footer, null);
			addView(moreView);
			moreView.setLayoutParams(new LayoutParams(
					android.view.ViewGroup.LayoutParams.FILL_PARENT,
					android.view.ViewGroup.LayoutParams.WRAP_CONTENT));

			mContentView = moreView.findViewById(R.id.xlistview_footer_content);
			mProgressBar = moreView
					.findViewById(R.id.xlistview_footer_progressbar);
			mHintView = (TextView) moreView
					.findViewById(R.id.xlistview_footer_hint_textview);
		}
	}
}
*/
